enum NUCLEOTIDE {NONE=0,C=1,T,G,A};
enum REPETITION {ZERO=0,ONE=1,TWO=2, MANY=999};
#include <vector>
struct OLIGO
{
	std::vector<NUCLEOTIDE> val;

	float rep_zero;
	float rep_one;
	float rep_two;
	float rep_many;

	int GetLength() { return val.size();};

	NUCLEOTIDE operator[](int index)
	{
		return val[index];
	};	

	OLIGO()
	{
	};

	OLIGO(const OLIGO & ol)
	{
		/*this->val.reserve(ol.val.size());
		for(int i=0; i < ol.val.size();i++)
		{
			this->val.push_back(ol.val[i]);
		}*/
		this->val = ol.val;

		rep_zero = ol.rep_zero;
		rep_one = ol.rep_one;
		rep_two = ol.rep_two;
		rep_many = ol.rep_many;
	};

	bool equal(OLIGO & ol) 
	{
		if (ol.GetLength() != GetLength())
			return false;
		for(int i = 0; i< ol.GetLength(); i++)
			if(ol[i] != val[i])
				return false;
		return true;			
	}

	float getRepetitionZero() { return rep_zero;};
	float getRepetitionOne() { return rep_one; };
	float getRepetitionTwo() { return rep_two; };
	float getRepetitionMany() { return rep_many; }; 


	int GetBindingEnergy(const NUCLEOTIDE& nucleo)
	{
		if(nucleo == NUCLEOTIDE::A || nucleo == NUCLEOTIDE::T)
		{
			return 1;
		}
		else if(nucleo == NUCLEOTIDE::C || nucleo == NUCLEOTIDE::G)
		{
			return 3;
		}
		throw -1;
	};

	int GetBindingEnergy()
	{
		
		int energy = 0;

		for(std::vector<NUCLEOTIDE>::const_iterator i = val.begin(); i < val.end(); ++i)
		{
			energy += this->GetBindingEnergy(*i);
		}

		return energy;
	};

};